const crypto = require('crypto');
const authConfig = require('../config/auth');

/**
 * 密码加密工具类
 * 支持md5加密方式
 */
const passwordUtils = {
  /**
   * 加密密码
   * @param {string} password - 原始密码
   * @returns {string} - 加密后的密码
   */
  hashPassword: function(password) {
    if (!password) {
      throw new Error('密码不能为空');
    }
    
    // 根据配置要求，使用MD5加密
    return this.md5Hash(password);
  },
  
  /**
   * 使用MD5加密字符串
   * @param {string} str - 要加密的字符串
   * @returns {string} - MD5哈希值
   */
  md5Hash: function(str) {
    return crypto.createHash('md5').update(str).digest('hex');
  },
  
  /**
   * 验证密码
   * @param {string} password - 原始密码
   * @param {string} hashedPassword - 存储的哈希密码
   * @returns {boolean} - 密码是否匹配
   */
  verifyPassword: function(password, hashedPassword) {
    if (!password || !hashedPassword) {
      return false;
    }
    const hashedInput = this.hashPassword(password);
    return hashedInput === hashedPassword;
  },
  
  /**
   * 检查密码强度
   * @param {string} password - 要检查的密码
   * @returns {Object} 包含强度信息的对象
   */
  checkPasswordStrength: function(password) {
    let strength = 0;
    const suggestions = [];

    if (!password) {
      return {
        strength: 0,
        message: '密码不能为空',
        suggestions: ['请输入密码']
      };
    }

    // 长度检查
    if (password.length < 6) {
      suggestions.push('密码长度至少为6个字符');
    } else if (password.length >= 8) {
      strength += 1;
    }

    // 包含数字
    if (/\d/.test(password)) {
      strength += 1;
    } else {
      suggestions.push('密码应包含数字');
    }

    // 包含小写字母
    if (/[a-z]/.test(password)) {
      strength += 1;
    } else {
      suggestions.push('密码应包含小写字母');
    }

    // 包含大写字母
    if (/[A-Z]/.test(password)) {
      strength += 1;
    } else {
      suggestions.push('密码应包含大写字母');
    }

    // 包含特殊字符
    if (/[^A-Za-z0-9]/.test(password)) {
      strength += 1;
    } else {
      suggestions.push('密码应包含特殊字符');
    }

    // 强度评级
    let strengthLevel = '弱';
    let message = '';

    if (strength <= 1) {
      strengthLevel = '弱';
      message = '密码强度较弱，容易被破解';
    } else if (strength <= 3) {
      strengthLevel = '中';
      message = '密码强度中等，建议增加复杂度';
    } else {
      strengthLevel = '强';
      message = '密码强度较强，安全性较高';
    }

    return {
      strength: strength,
      strengthLevel: strengthLevel,
      message: message,
      suggestions: suggestions
    };
  },
  
  /**
   * 生成随机密码
   * @param {number} length - 密码长度
   * @returns {string} - 随机生成的密码
   */
  generateRandomPassword: function(length = 12) {
    const charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()';
    let password = '';
    for (let i = 0; i < length; i++) {
      const randomIndex = Math.floor(Math.random() * charset.length);
      password += charset[randomIndex];
    }
    return password;
  }
};

module.exports = passwordUtils;

// 导出密码工具供全局使用
global.passwordUtils = passwordUtils;